using System;
using System.Collections.Concurrent;
using System.IO;
using System.Net.Sockets;
using System.Threading;
using 游戏服务器.地图类;
using 游戏服务器.数据类;
using 游戏服务器.网络类;

namespace 游戏服务器
{
	public static class 主程
	{
		public static DateTime 当前时间;

		public static DateTime 每秒计时;

		public static ConcurrentQueue<GM命令> 外部命令;

		public static uint 循环计数;

		public static bool 已经启动;

		public static bool 正在保存;

		public static Thread 主线程;

		public static Random 随机数;

		public static void 启动服务()
		{
			主程.添加系统日志(软件验证.数据解密("b+u7SLdAk+I9c0wP3dBxTQDTnU38+aARy/uW6755km6F9r077eeS5OUkwD9mkmg1tKHIU77BqlDdKXoWussoo3HNjLVts/UhgDibipQ4SrF+9yurp6hHJLx91DVvcMsRJGqXuZhjmc7r1H1AmqKMoTprurO6ZhRcAoh0OKDAhluO8eyhiehEOAM+8LaTX32Ykpqh3o2X0MQ2wk+UfnYAV1q05Mx5L9xZwd8DSty4FeJBKGfzrt6jr/MPv3NePjz2EjCBQMN+lLqRQGlpgDCliICAmIlSTlKsdhtzr/48KczbTGkJ/DYSmbbktBEFDP4/CM8vD7Xof94h9V2FWn6OSA=="));
			if (!主程.已经启动)
			{
				Thread obj;
				obj = new Thread(服务循环)
				{
					IsBackground = true
				};
				主程.主线程 = obj;
				obj.Start();
			}
		}

		public static void 停止服务()
		{
			主程.已经启动 = false;
			网络服务网关.结束服务();
		}

		public static void 添加系统日志(string 文本)
		{
			主窗口.添加系统日志(文本);
		}

		public static void 添加聊天日志(string 前缀, byte[] 文本)
		{
			主窗口.添加聊天日志(前缀, 文本);
		}

		private static void 服务循环()
		{
			主程.外部命令 = new ConcurrentQueue<GM命令>();
			主窗口.添加系统日志("正在生成地图元素...");
			地图处理网关.开启地图();
			主窗口.添加系统日志("正在启动网络服务...");
			网络服务网关.启动服务();
			主窗口.添加系统日志("服务器已成功开启");
			主程.已经启动 = true;
			主窗口.服务启动回调();
			while (主程.已经启动 || 网络服务网关.网络连接表.Count != 0)
			{
				主程.当前时间 = DateTime.Now;
				try
				{
					if (主程.当前时间 > 主程.每秒计时)
					{
						游戏数据网关.保存数据();
						主窗口.更新连接总数((uint)网络服务网关.网络连接表.Count);
						主窗口.更新已经登录(网络服务网关.已登录连接数);
						主窗口.更新已经上线(网络服务网关.已上线连接数);
						主窗口.更新发送字节(网络服务网关.已发送字节数);
						主窗口.更新接收字节(网络服务网关.已接收字节数);
						主窗口.更新对象统计(地图处理网关.激活对象表.Count, 地图处理网关.次要对象表.Count, 地图处理网关.地图对象表.Count);
						主窗口.更新后台帧数(主程.循环计数);
						主程.循环计数 = 0u;
						主程.每秒计时 = 主程.当前时间.AddSeconds(1.0);
					}
					else
					{
						主程.循环计数++;
					}
					GM命令 result;
					while (主程.外部命令.TryDequeue(out result))
					{
						result.执行命令();
					}
					网络服务网关.处理数据();
					地图处理网关.处理数据();
				}
				catch (Exception ex)
				{
					主窗口.添加系统日志("发生致命错误, 服务器即将停止");
					if (!Directory.Exists(".\\Log\\Error"))
					{
						Directory.CreateDirectory(".\\Log\\Error");
					}
					File.WriteAllText($".\\Log\\Error\\{DateTime.Now:yyyy-MM-dd--HH-mm-ss}.txt", "错误信息:\r\n" + ex.Message + "\r\n堆栈信息:\r\n" + ex.StackTrace);
					主窗口.添加系统日志("错误信息已保存到日志, 请注意查看");
					foreach (客户网络 item in 网络服务网关.网络连接表)
					{
						try
						{
							item.当前连接?.Client?.Shutdown(SocketShutdown.Both);
							item.当前连接?.Close();
						}
						catch
						{
						}
					}
					break;
				}
			}
			主窗口.添加系统日志("正在清理物品数据...");
			地图处理网关.清理物品();
			主窗口.添加系统日志("正在保存客户数据...");
			游戏数据网关.导出数据();
			主窗口.服务停止回调();
			主程.主线程 = null;
			主窗口.添加系统日志("服务器已成功关闭");
		}

		static 主程()
		{
			Class2.sov79KqzBKBU1();
			主程.当前时间 = DateTime.Now;
			主程.每秒计时 = DateTime.Now.AddSeconds(1.0);
			主程.随机数 = new Random();
		}
	}
}
